local M = {}

-- LSP 回调函数快捷键设置
M.map_lsp = function(bufnr)
  local bufopts = { noremap = true, silent = true, buffer = bufnr }
  vim.keymap.set("n", "gD", vim.lsp.buf.declaration, bufopts)
  vim.keymap.set("n", "gd", vim.lsp.buf.definition, bufopts)
  vim.keymap.set("n", "K", vim.lsp.buf.hover, bufopts)
  vim.keymap.set("n", "<space>D", vim.lsp.buf.type_definition, bufopts)
  vim.keymap.set("n", "<space>rn", vim.lsp.buf.rename, bufopts)
  vim.keymap.set("n", "gr", vim.lsp.buf.references, bufopts)
  vim.keymap.set("n", "<space>ca", vim.lsp.buf.code_action, bufopts)
  vim.keymap.set("n", "gh", vim.lsp.buf.hover, bufopts)
  vim.keymap.set("n", "gi", vim.lsp.buf.implementation, bufopts)
  vim.keymap.set("n", "go", vim.diagnostic.open_float, bufopts)
  vim.keymap.set("n", "gp", vim.diagnostic.goto_prev, bufopts)
  vim.keymap.set("n", "gn", vim.diagnostic.goto_next, bufopts)
  vim.keymap.set("n", "gq", vim.diagnostic.setloclist, bufopts)
end

-- 初始化基础键位映射
M.setup = function()
  -- 标签页
  vim.api.nvim_set_keymap("n", "z<tab>", ":tabnext<CR>", {})
  vim.api.nvim_set_keymap("n", "ztn", ":tabnew<CR>", {})
  
  -- 任务管理器
  vim.api.nvim_set_keymap("n", "ztt", ":OverseerToggle<CR>", {})
  vim.api.nvim_set_keymap("n", "zto", ":OverseerRun<CR>", {})
  vim.api.nvim_set_keymap("n", "ztc", ":OverseerRunCmd<CR>", {})
  
  -- Vista 开关
  vim.api.nvim_set_keymap("n", "zv", ":Vista!!<CR>", {})
  
  -- 切换窗格
  vim.api.nvim_set_keymap("n", "z<down>", "<C-w><down>", { noremap = true, silent = true })
  vim.api.nvim_set_keymap("n", "z<up>", "<C-w><up>", { noremap = true, silent = true })
  vim.api.nvim_set_keymap("n", "z<left>", "<C-w><left>", { noremap = true, silent = true })
  vim.api.nvim_set_keymap("n", "z<right>", "<C-w><right>", { noremap = true, silent = true })
  
  -- 内置终端
  vim.api.nvim_set_keymap("t", "<ESC>", "<C-\\><C-n>", { noremap = true })
  
  -- 代码格式化
  vim.api.nvim_set_keymap("n", "zfm", "<cmd>lua vim.lsp.buf.format({ timeout_ms = 5000 })<CR>", { silent = true })
  
  -- 缓冲区浏览器
  vim.api.nvim_set_keymap("n", "zb", "<cmd>BufExplorerVerticalSplit<CR>", {})
  
  -- 文件搜索热键
  vim.api.nvim_set_keymap("n", "zs", "<cmd>FzfLua files<CR>", {})
  
  -- NvimTree
  vim.api.nvim_set_keymap("n", "f", ":NvimTreeToggle<CR>", { noremap = true })
end

return M
